package com.huike.springboot1.demos.controller;

import com.github.pagehelper.PageInfo;
import com.huike.springboot1.demos.pojo.Product;
import com.huike.springboot1.demos.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.math.BigDecimal;
import java.util.List;

@Controller
public class AdminProductController {
    @Autowired
    ProductService productService;

    //    删除方法二：使用ajax方式
    //    常用项目访问路径
    @GetMapping("/productTable1")
//    控制层通过访问项目路径，可以将数据库中的数据以products为参数名传递到productList页面
//    Model：是SpringMVC中的"M“：模型(数据),前后端交互时的数据模型,后端向前端传递数据使用model    "V"：视图(页面)
    //    法二：也可以用modelAndViewL类型
    public ModelAndView getProductList1(ModelAndView modelAndView) {
        //TODO
//        model将数据作为products参数传递productList(视图)，括号内的内容是，参数名,参数值
        modelAndView.addObject("products", productService.getProductList());
        modelAndView.setViewName("admin/productTable1");
        return modelAndView;
    }

    @DeleteMapping("/deleteProduct1")
    @ResponseBody //把数据转为json格式，返回json格式数据
    public String deleteProduct1(Long id, Model model) {
//        增删改一条数据操作，不需要返回类型，在数据库中增删改一条数据就是返回int的数字类型的行数，没有返回数据类型的意义
        productService.deleteProductById(id);
        //TODO
//        model将数据作为products参数传递productList(视图)，括号内的内容是，参数名,参数值
        model.addAttribute("products", productService.getProductList());
//        return "admin/productTable1";//返回一个在templates路径下的页面名称，productList是templates里的文件
        // 传递到页面的数据product可以通过美元符号$进行获取，在全局配置文件中设置页面文件路径
        return "OK";
    }

    //纯新增部分：
    @GetMapping("/productTabList")
    public String tabListProduct1(Model model) {         // 新增
        model.addAttribute("product", new Product());
        return "admin/productTabList";    // html页面
    }

    @PostMapping("/postProductList")
    @ResponseBody
    public String postProduct1(@RequestBody Product product) {
//     @RequestBody   请求体里那段 JSON/XML（现在是 JSON 居多）自动反序列化成一个 Product 对象
        productService.insertProduct(product);   // 新增
        System.out.println("收到商品：" + product);//测试是否能接收到数据
        return "PostOK";
    }

    //    打开表单页（新增/修改）
    @GetMapping("/productTabList1")
    public String tabListProduct(@RequestParam(required = false) Long id,
                                 Model model) {
        if (id != null) {                 // 修改
            Product product = productService.selectProductById(id);
            model.addAttribute("product", product);
        } else {                          // 新增
            model.addAttribute("product", new Product());
        }
        return "admin/productTabList1";    // html页面
    }

    @PostMapping("/postProductList1")
    @ResponseBody
    //    @ResponseBody 使用后返回值为字符串
    public String postProduct(@RequestBody Product product) {
//     @RequestBody   请求体里那段 JSON/XML自动反序列化成一个 Product 对象，@RequestBody	接收请求体中的 JSON/XML 数据
        if (product.getId() == null) {
            productService.insertProduct(product);   // 新增
//            System.out.println("收到商品：" + product);//测试是否能接收到数据
            return "PostOK";
        } else {
            productService.updateProductById(product);   // 修改
//            System.out.println("收到商品：" + product);//测试是否能接收到数据
            return "PutOK";
        }
    }


    //    多条件查询
//    @PostMapping("/searchProduct1")
//    @ResponseBody 使用后返回值为字符串
    //    如果前后端(视图层和控制层)的name属性的属性值参数名一致，如name="productName"，则可直接写： 类型 变量名 如： String name；
//    如果不一致则：要使用@RequestParam设置请求参数名称：@RequestParam(value = "旧变量名"  required = false) 类型 新变量名 ，类型用包装类型
//    如： @RequestParam(value = "minAmount", required = false) Integer min
//    类型要对应，否则会报错，Amount要用Double或BigDecimal，否则类型不对应会报错400
//    @RequestParam(...,required=true)非必填；@RequestParam(...,required=false)必填；@RequestParam(...,defaultValue="0")必填

//单独多条件查询，不包含分页查询
//    public String searchProduct(Model model, String productName, @RequestParam(value = "minAmount", required = false) BigDecimal min, BigDecimal maxAmount, String productCategory) {
////        测试是否能拿到数据
//        List<Product> list= productService.searchProduct(productName,min,maxAmount,productCategory);
//        System.out.println(productName + "," + min + "," + maxAmount + "," + productCategory);
//        model.addAttribute("products", list);
////        通过替换部分页面内容来回显数据，不刷新页面，只是通过把数据返回到select页面中回应数据进行刷新
//        return "basic/select :: prodList";
//    }

    @PostMapping("/searchProduct1")
//    设置默认起始页码和页数
    public String searchProduct1(Model model, String productName, @RequestParam(value = "minAmount", required = false) BigDecimal min, BigDecimal maxAmount, String productCategory,
                                 @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "9") int pageSize) {
        PageInfo<Product> pageInfo = productService.searchProduct1(productName, min, maxAmount, productCategory, pageNum, pageSize);
//        System.out.println("pageInfo = " + pageInfo);
        model.addAttribute("products", pageInfo.getList());//纯数据
        model.addAttribute("page", pageInfo);//纯页码
//        通过替换部分页面内容来回显数据，不刷新页面，只是通过把数据返回到select页面中回应数据进行刷新
        return "basic/select :: prodList";
    }

}
